package ru.compscicenter.uno.model;

import java.util.HashMap;

/**
 * Created by IntelliJ IDEA.
 * User: Павел
 * Date: 12.11.11
 * Time: 0:11
 * To change this template use File | Settings | File Templates.
 */
public class Rules {
	public static enum Rule {
		//переводы специальных карт
		TRANSFER, //перевод (накопление +2, +4, etc)
		REVERSE, //действие карты - применить действие специальной карты на положивлего её

		//подкидывания
		THROW, //подкидывание
		THROW_ONLY_NUMERIC, //подкидывать можно только числовые карты (работает только при включенном THROW)
		EIGTH_EXTRA, //8 даёт право игроку на дополнительный ход по правилам

		//обмен картами
		SEVEN_ZERO_EXCHANGE, //0 - передача всех карт соседним игрокам по ходу игры; 7 - обмен с любым по выбору
		FIVE_EXCHANGE, //5 - обмен в любым игроком одной картой. оба выбирают, какой картой меняться
		RED_ZERO, // кто выложил красный 0 - может обменяться всеми картами с любым из игроков

		//на скорость
		UNO_IN_CENTER, //тот, кро кричит уно, кладёт руку на стол
		TWO_IN_CENTER, //кто выложил 2 - кладёт руку на стол

		//ход игры и определение победителя
		FIRST_LOOSER, //каждый получает сколько осталось, когда ктото набирает 500, выирывает тот у кого min
        LAZY_SCORING, //игра заканчивается после первого раунда
		LAST_HERO, //раунд продолжается, пока не останется один проигравший
		SEVEN_ROUNDS, //победитель не выходит, а берёт 6 карт из колоды и играет дальше. затем 5 и т.д. пока не дойдёт до 0
		DROP_ZERO, //цена карты 0 - 50 очков
		COLOR_BY_CIRCLE //цвет на чёрных картах выбирается по кругу (ибо цвета нарисованы на карте) после текущего
	}

    public static final int DEFAULT_POINTS_TO_WIN = 500;

    private int pointsToWin = DEFAULT_POINTS_TO_WIN;
	private HashMap<Rule, Boolean> rules = new HashMap<Rule, Boolean>();

	public Rules() {
		setDefaults();
	}

    public int getPointsToWin() {
        return pointsToWin;
    }

    public void setPointsToWin(int pointsToWin) {
        this.pointsToWin = pointsToWin;
    }
	public void setDefaults() {
		for (Rule rule : Rule.values()) {
			rules.put(rule, false);
		}
	}

	public boolean isActivated(Rule rule) {
		if (rules.containsKey(rule)) {
			return rules.get(rule);
		}
		return false;
	}

	public void set(Rule rule, boolean value){
		rules.put(rule, value);
	}

	@Override
	public String toString() {
		StringBuilder string = new StringBuilder();
		for (Rule rule : Rule.values()) {
			string.append(rule.name() + " = " + isActivated(rule) + System.getProperty("line.separator"));
		}
		return string.toString();
	}

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Rules rules1 = (Rules) o;

        if (rules != null ? !rules.equals(rules1.rules) : rules1.rules != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        return rules != null ? rules.hashCode() : 0;
    }
}
